package com.guqj.basis.proxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * <p>
 * Cglib的原理是对指定的目标类动态生成一个子类，并覆盖其中方法实现增强，但因为采用的是继承，所以不能对final修饰的类和final方法进行代理
 * </p>
 * 
 * @author guqj
 * @date 2017年3月10日
 */
public class HeroCglibProxy implements MethodInterceptor {

	private Object target;

	/**
	 * 创建代理对象
	 * 
	 * @param target
	 * @return
	 */
	public Object getInstance(Object target) {
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		// 设置回调过滤器 CallbackFilter
		// 回调方法
		enhancer.setCallback(this);
		// 创建代理对象
		return enhancer.create(); // 调用的是默认的构造器来创建target实例的
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("--- before ---");
		System.out.println("Method: " + method);
		System.out.println("MethodProxy: " + proxy);
		Object result = proxy.invokeSuper(obj, args);
		System.out.println("--- after ---");
		return result;
	}

}
